package com.idemon.springbootscheduledtasks;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class ScheduledTasks {
    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    private static long taskTime = 1000;

    /**
     * 定时任务启动时间：firstStart
     * 每次执行任务开始时间：taskStart
     * 每次执行任务完毕时间：taskEnd
     * 执行一次任务耗时：taskTime
     * 间隔时间：fixedRate：
     * fixedRate表示从firstStart算起，每隔fixedRate秒执行一次任务
     * 1）如果taskTime<=fixedRate
     *      则第n次开始执行任务的时间：taskStart = firstStart + （n - 1） * fixedRate；
     *      则第n次执行完成任务的时间：taskEnd = taskStart + taskTime；
     * 2）如果taskTime>fixedRate
     *      则第n次开始执行任务的时间：taskStart = n-1次任务的taskEnd；n = 1时，taskStart = firstStart
     *      则第n次执行完成任务的时间：taskEnd = taskStart + taskTime；
     */
    @Scheduled(fixedRate = 3000)
    private void reportCurrentTime1() {
        log.info("=========================");
        log.info("fixedRate:{}",3000);
        log.info("taskStart:{}",dateFormat.format(new Date()));
        //模拟执行一次任务耗时：taskTime
        try {
            Thread.sleep(taskTime);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("taskTime:{}",taskTime);
        log.info("taskEnd:{}",dateFormat.format(new Date()));
        taskTime += 1000;
    }
    /**
     * 定时任务启动时间：firstStart
     * 每次执行任务开始时间：taskStart
     * 每次执行任务完毕时间：taskEnd
     * 执行一次任务耗时：taskTime
     * 延迟时间：fixedDelay：
     * fixedDelay表示从每次任务的taskEnd算起，延迟fixedDelay秒执行下一次任务
     * 则第n次开始执行任务的时间：taskStart = n-1次任务的taskEnd + fixedDelay；n = 1时，taskStart = firstStart
     * 则第n次执行完成任务的时间：taskEnd = taskStart + taskTime；
     */
    @Scheduled(fixedDelay = 3000)
    private void reportCurrentTime2() {
        log.info("=========================");
        log.info("fixedDelay:{}",3000);
        log.info("taskStart:{}",dateFormat.format(new Date()));
        //模拟执行一次任务耗时：taskTime
        try {
            Thread.sleep(taskTime);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("taskTime:{}",taskTime);
        log.info("taskEnd:{}",dateFormat.format(new Date()));
        taskTime += 1000;
    }
    /**
     * 第一次延迟initialDelay毫秒执行
     */
    @Scheduled(initialDelay = 1000)
    private void reportCurrentTime3() {
        log.info("=========================");
    }
    /**
     * 工作日每天0点
     */
    @Scheduled(cron = "0 0 0 ? * W")
    public void reportCurrentTime4() {
        log.info("The time is now {}", dateFormat.format(new Date()));
    }
}
